package com.wans.model.lottery.ssq.dtos;

import com.wans.model.lottery.ssq.dos.SSQUser;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@SuppressWarnings("all")
public class UserRecordDTO {
    /**
     * id - 留着修改时使用
     */
    private String id;

    /**
     * 期号
     */
    private String code;

    /**
     * 投注倍数
     */
    private Integer multiplicative = 1;

    /**
     * 红球号码列表
     */
    private List<Integer> redValue;

    /**
     * 蓝球号码列表
     */
    private List<Integer> blueValue;


    /**
     * 计算双色球投注总注数
     *
     * @return 总注数（如果红球不足6个则返回0）
     */
    public int calculateBetCount() {
        // 检查红球数量
        int redCount = (redValue != null) ? redValue.size() : 0;

        // 红球不足6个无法组成完整投注
        if (redCount < 6) {
            return 0;
        }

        // 计算红球组合数 C(n, 6)
        int redCombinations = combination(redCount, 6);

        // 计算蓝球数量
        int blueCount = (blueValue != null) ? blueValue.size() : 0;
        blueCount = Math.max(blueCount, 1); // 至少1个蓝球

        // 计算总注数
        return redCombinations * blueCount;
    }

    /**
     * 计算组合数 C(n, k)
     */
    private int combination(int n, int k) {
        if (k < 0 || k > n) return 0;
        if (k == 0 || k == n) return 1;

        // 使用迭代计算组合数（避免阶乘溢出）
        long numerator = 1;
        long denominator = 1;

        // 优化计算: C(n, k) = C(n, n-k)
        k = Math.min(k, n - k);

        for (int i = 1; i <= k; i++) {
            numerator *= (n - i + 1);
            denominator *= i;

            // 每步 约分防止溢出
            long gcd = gcd(numerator, denominator);
            numerator /= gcd;
            denominator /= gcd;
        }

        return (int) (numerator / denominator);
    }

    /**
     * 计算最大公约数
     */
    private long gcd(long a, long b) {
        return b == 0 ? a : gcd(b, a % b);
    }


    /**
     * 转换为SSQUser对象
     *
     * @return 转换后的SSQUser对象
     */
    public SSQUser toSSQUser() {
        SSQUser ssqUser = new SSQUser();
        ssqUser.setCode(this.code);

        // 红球转换：数字 -> 两位字符串（带前导零）
        ssqUser.setRedBalls(
                this.redValue.stream()
                        .map(num -> String.format("%02d", num))
                        .sorted()
                        .collect(Collectors.joining(","))
        );

        // 蓝球转换：数字 -> 两位字符串（带前导零）
        ssqUser.setBlueBalls(
                this.blueValue.stream()
                        .map(num -> String.format("%02d", num))
                        .sorted()
                        .collect(Collectors.joining(","))
        );

        // 设置默认值
        ssqUser.setBonusPrize("0");  // 初始中奖金额0元
        ssqUser.setPrizeLevel("0");  // 0-待开奖
        ssqUser.setDeletedFlag(0);   // 未删除

        return ssqUser;
    }

    /**
     * 转换为SSQUser对象（带ID）
     *
     * @param id 主键ID
     * @return 转换后的SSQUser对象
     */
    public SSQUser toSSQUser(String id) {
        SSQUser ssqUser = this.toSSQUser();
        ssqUser.setId(id);
        return ssqUser;
    }

    /**
     * 转换为SSQUser对象（带ID）
     *
     * @param id     主键ID
     * @param userId 用户ID
     * @return 转换后的SSQUser对象
     */
    public SSQUser toSSQUser(String id, String userId) {
        SSQUser ssqUser = this.toSSQUser(id);
        ssqUser.setUserId(userId);
        return ssqUser;
    }
}
